package com.example.shiro.service.impl;

import com.example.shiro.dto.AddUserDto;
import com.example.shiro.entity.User;
import com.example.shiro.entity.UserRole;
import com.example.shiro.mapper.ResourceMapper;
import com.example.shiro.mapper.UserMapper;
import com.example.shiro.mapper.UserRoleMapper;
import com.example.shiro.service.UserService;
import com.example.shiro.utils.ShiroPasswordUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.*;

/**
 * @ClassName UserServiceImpl
 * @Description TODO 用户业务层实现类
 * @Version 1.0
 */
@Service
public class UserServiceImpl implements UserService {
    // 用户持久层
    @Autowired
    private UserMapper userMapper;
    // 用户角色中间表持久层
    @Autowired
    private UserRoleMapper userRoleMapper;
    // 资源持久层
    @Autowired
    private ResourceMapper resourceMapper;
    /*
     * @Description //TODO 根据id查询用户数据
     * @Params [id]
     * @return com.example.shiro.entity.User
     * @version 1.0
     **/
    @Override
    public User findById(String id) {
        return userMapper.findById(id);
    }

    /*
     * @Description //TODO 根据id查询用户详情
     * @Params [id]
     * @return com.example.shiro.entity.User
     * @version 1.0
     **/
    @Override
    public User getDetailById(String id) {
        return userMapper.getDetailById(id);
    }
    /*
     * @Description //TODO 新增用户
     * @Params [addUserDto]
     * @return java.util.Map<java.lang.String,java.lang.String>
     * @version 1.0
     **/
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int add(AddUserDto addUserDto) throws Exception {
        // 声明结果集
        Map<String, Object> res = new HashMap<>();
        // 声明状态值，0表示失败，1表示成功
        int status = 1;
        // 调用持久层方法，根据登录名查询用户对象
        User user = userMapper.findByLoginName(addUserDto.getLoginName());
        if (user != null) {
//            throw new Exception("该登录名已存在，请重新输入");
            return 0;
        }
        // 实例化用户对象
        user = new User();
        // 用户Id
        String userId = UUID.randomUUID().toString().replace("-", "");
        // 复制前端传的属性给用户对象
        BeanUtils.copyProperties(addUserDto, user);
        user.setId(userId);
        // 生成随机盐值
        String salt = ShiroPasswordUtil.generateSalt();
        user.setSalt(salt);

        // 加密密码
        String encryptedPassword = ShiroPasswordUtil.encryptPassword(
                addUserDto.getPassword(), salt);
        user.setPassword(encryptedPassword);
        // 新增用户数据
        userMapper.add(user);
        // 获取角色id列表
        Set<String> roleIdList = addUserDto.getRoleIdList();
        if (!CollectionUtils.isEmpty(roleIdList)) {
            // 获取角色id列表不为空，组装要保存的用户角色中间表列表数据
            List<UserRole> list = new ArrayList<>(roleIdList.size());
            for (String roleId : roleIdList) {
                list.add(new UserRole(userId, roleId));
            }
            // 新增用户角色中间表数据
            userRoleMapper.batchAdd(list);
        }
        return 1;
    }

    /*
     * @Description //TODO 利用登录名查询用户的角色
     * @Params [loginName]
     * @return java.util.Set<java.lang.String>
     * @version 1.0
     **/
    @Override
    public Set<String> findRoleCodesByLoginName(String loginName) {
        return userMapper.findRoleCodesByLoginName(loginName);
    }
    /*
     * @Description //TODO 根据角色编码列表，查询资源列表
     * @Params [roles]
     * @return java.util.Set<java.lang.String>
     * @version 1.0
     **/
    @Override
    public Set<String> findResourceCodesByRoles(Set<String> roles) {
        return resourceMapper.findResourceCodesByRoles(roles);
    }

    /*
     * @Description //TODO 根据登录名查询用户信息
     * @Params [loginName]
     * @return com.example.shiro.entity.User
     * @version 1.0
     **/
    @Override
    public User findByLoginName(String loginName) {
        return userMapper.findByLoginName(loginName);
    }
}
